import math
# данный класс используется для хранения данных об объекте в R-дереве
class Extent:
    # функция инициализации
    # переменные id и geometry заданы со значением по умолчанию, так как не всегда требуется использовать объект
    # класса в качестве хранилища отдельных объектов
    # он также используется для MBR групп объектов в R-дереве
    def __init__(self, xmin, xmax, ymin, ymax, id = None, geometry = None):
        # переменные, на основе которых расчитывается MBR
        self.xmin = xmin
        self.xmax = xmax
        self.ymin = ymin
        self.ymax = ymax
        # ID и геометрия объекта
        self.id = id
        self.geometry = geometry
    # получение значения из объекта через доступ по индексу
    def __getitem__(self, i):
        if i == 0: return self.xmin
        if i == 1: return self.xmax
        if i == 2: return self.ymin
        if i == 3: return self.ymax

        return None
    # как будет выводится объект на экран
    def __repr__(self):
        return "[{0}, {1}, {2}, {3}]".format(self.xmin, self.ymin, self.xmax, self.ymax)
    # сравнение, равный ли объекты класса
    def __eq__(self, other):
        return self.xmin == other.xmin and\
            self.xmax == other.xmax and\
            self.ymin == other.ymin and\
            self.ymax == other.ymax
    # проверка на соприкосновение MBR объектов
    def is_touches(self, other):
        return not(self.xmin > other.xmax or\
            self.xmax < other.xmin or\
            self.ymin > other.ymax or\
            self.ymax < other.ymin)
    # получение дистанции между объектами
    def get_distance(self, other):
        x1 = self.xmin + (self.xmax - self.xmin) / 2.0
        y1 = self.ymin + (self.ymax - self.ymin) / 2.0
        x2 = other.xmin + (other.xmax - other.xmin) / 2.0
        y2 = other.ymin + (other.ymax - other.ymin) / 2.0

        return math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
    # получение площади MBR объекта
    def get_area(self):
        return (self.xmax - self.xmin) * (self.ymax - self.ymin)
    # получение пересечения объектов
    def get_intersect(self, other):
        if not self.is_touches(other):
            return 0

        xmin = min(self.xmin, other.xmin)
        xmax = max(self.xmax, other.xmax)
        ymin = min(self.ymin, other.ymin)
        ymax = max(self.ymax, other.ymax)

        return (xmax - xmin) * (ymax - ymin)
